<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>04_面向对象03</title>
	</head>
	<body>
		<script type="text/javascript">
			/* 
				JS面向对象里的重要概念
				1. 原型对象  ***
				2. constructor属性  *
				3. __proto__属性  **
				4. 原型链  ***
				5. 原型链的应用  **继承
			 */

			function Student(name, age, sex) {
				this.name = name;
				this.age = age;
				this.sex = sex;
			}

			/* 
				概念一: 原型对象  prototype
				原型对象是构造函数的属性, 属于构造函数, 本质上就是一个对象, JS会为每个构造函数内置一个原型对象, 可以通过语法 构造函数.prototype获取. 
				因为原型对象是对象, 所以我们可以为其新增属性或者方法, 而且, 给原型对象添加的属性或者方法能被构造函数实例化的每一个实例对象所拥有!
			 */
			Student.prototype.job = "学生";
			Student.prototype.sayHi = function() {
				console.log(`你好, 我叫${this.name}, 我今年${this.age}岁`);
			}
			var stu1 = new Student("张三", 20, "男");
			var stu2 = new Student("李四", 21, "女");
			var stu3 = new Student("王五", 22, "男");
			console.log(stu1);
			console.log(stu2);
			console.log(stu3);
			console.log(stu1.name, stu1.job);
			stu1.sayHi();



			var arr = [1, 5, 6, 0, 7, 3, 0, 5, 9, 5, 5];
			
			Array.prototype.unique = function() {
				
				for (var i = 0, len = this.length; i < len; i++) {
					for (var j = i + 1, len = this.length; j < len; j++) {
						if (this[i] === this[j]) {
							this.splice(j, 1);
							j--; // 每删除一个数j的值就减1
							len--; // j值减小时len也要相应减1（减少循环次数，节省性能）   

						}
					}
				}
			}	
			// console.log(arr);
			// arr.unique();
			// console.log(arr);
			
			// var arr1 = [1,2,3,3,3,4,5,5];
			// arr1.unique();
			
			
			/* 
				概念二:  constructor属性
					该属性属于原型对象, 任何一个构造函数的原型对象都再带一个constructor属性, 该属性指向原型对象所属的构造函数
			 */
			console.log(Student);
			console.log(Student.prototype);
			
			/* 
				概念三: __proto__属性
				该属性属于实例对象(new出来的对象), 该属性指向实例对象所属的构造函数的原型对象
			 */
			console.log(stu1.__proto__);
			
			
			/* 
				概念四: 原型链
				对象查找自身属性或者方法时的流程
				1. 先到自身内部查找是否有对应属性或方法,如果有,直接用
				2. 如果没有, 会继续到实例对象的构造函数的原型对象里查找是否有对应属性或者方法, 如果有, 也可使用
				3. 如果还没有, 继续到当前实例对象的构造函数的原型对象的构造函数的原型对象里继续查找.如果有, 还可以使用
				4. 直到找到构造函数为Object的原型对象里, 如果还未找到, 属性会报undefined, 函数会报错!
				
				以上实例在沿着原型对象不断查找其属性或者方法的过程, 形成的链式结构, 我们称之为"原型链"!
			 */
			// console.log(stu1.name);
			// console.log(stu1.job);
			// console.log(stu1.abc);
			// console.log(stu1.__proto__.__proto__);
			
			// // new Object()
			// var obj = {};
			// console.log(obj.__proto__.constructor);
		</script>
	</body>
</html>
